package com.sugar.MultiThread.a11threadsafe3;


import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 实现方式一：继承Thread
 *
 *
 * @author felix
 * @date 2025/2/26 09:32
 */
public class MyThread extends Thread {

    static int ticket = 0;

    static Lock lock = new ReentrantLock();

    /**
     * 重写Runnable接口的run方法，用于实现线程的逻辑
     * 本方法主要用于模拟卖票的线程任务，通过循环不断尝试卖票
     * 使用ReentrantLock来控制并发，确保在同一时间只有一个线程可以执行卖票操作
     */
    @Override
    public void run() {
        while (true) {
            // 获取锁，确保线程安全
            lock.lock();
            try {
                // 检查票数是否达到上限
                if(ticket == 100){
                    // 达到上限则退出循环，停止卖票
                    break;
                }else {
                    // 未达到上限，则暂停一段时间，模拟卖票过程
                    Thread.sleep(100);
                    // 卖出一张票，票数增加
                    ticket++;
                    // 打印线程名称和卖出的票号
                    System.out.println(getName() + "在卖第" + ticket + "张票！！！");
                }
            } catch (InterruptedException e) {
                // 捕获中断异常，打印异常信息
                e.printStackTrace();
            } finally {
                // 释放锁，确保其他线程可以进入临界区
                lock.unlock();
            }
        }
    }

}
